參考這個範例:Animation
const (
screenWidth = 320
screenHeight = 240
frameOX = 0
frameOY = 32
frameWidth = 32
frameHeight = 32
frameCount = 8 // frameCount 取決於總共有幾張圖片
)
// ...略
func (g *Game) Update() error {
g.count++
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(-float64(frameWidth)/2, -float64(frameHeight)/2)
op.GeoM.Translate(screenWidth/2, screenHeight/2)
// count 通常在 Update() 持續遞增
// 因此調整目前數字 5 的部分可以調整顯示速度
i := (g.count / 5) % frameCount
sx, sy := frameOX+i*frameWidth, frameOY
// 單張圖片可以繪製該圖片的一小部分,也就是說可以分割成多張圖片繪製
// 控制裡面的變數,達成動畫的效果
screen.DrawImage(runnerImage.SubImage(image.Rect(sx, sy, sx+frameWidth, sy+frameHeight)).(*ebiten.Image), op)
}
// ...略
這邊比較麻煩的地方是需要知道圖片的大小,尤其是網路圖片通常都不會標註,每一格圖片的長寬是多少
因此,如果不借助其他工具的話,可以這樣使用。一邊動態調整數值,找到適當的長寬然後記錄下來
// 範例
var frameOX int = 0
// 鍵盤偵測調整數值
if repeatingKeyPressed(ebiten.KeyZ) {
frameOX++
}
// 顯示目前數值
ebitenutil.DebugPrintAt(screen, fmt.Sprintf("frameOX: %d", frameOX), 0, 20)